#ifndef __MPU6050_CONFIG_H
#define __MPU6050_CONFIG_H

#include "stm32f10x.h"          // 包含STM32F10x系列外设库定义
#include "MPU6050_Reg.h"        // 包含MPU6050寄存器地址宏定义
#include "IIC_Simulate_Config.h"// 包含软件模拟I2C的函数声明
#include "stdbool.h"            // 提供bool类型支持

/**
 * @brief  MPU6050的I2C从设备地址
 * @note   7位地址为0x68，左移1位后为0xD0（写模式），0xD1（读模式）
 *         地址由AD0引脚决定：
 *         - AD0接GND → 0x68（默认）
 *         - AD0接VCC → 0x69
 */
#define	MPU6050_SLAVE_ADDRESS	0x68

/**
 * @brief  产生I2C起始信号
 * @note   时序要求：SCL高电平时，SDA产生下降沿
 *         调用软件I2C驱动的IIC_Start()实现
 */
void MPU6050_Start(void);

/**
 * @brief  产生I2C停止信号
 * @note   时序要求：SCL高电平时，SDA产生上升沿
 *         调用软件I2C驱动的IIC_Stop()实现
 */
void MPU6050_Stop(void);

/**
 * @brief  等待MPU6050的应答信号
 * @retval true：收到应答（SDA为低电平）
 *         false：未收到应答（SDA为高电平，通信失败）
 * @note   用于确认I2C数据传输是否成功
 */
bool MPU6050_Wait_ACK(void);

/**
 * @brief  向MPU6050的指定寄存器写入数据
 * @param  Reg_Address：目标寄存器地址（如PWR_MGMT_1、SMPLRT_DIV等）
 * @param  IIC_Data：要写入的数据字节
 * @retval true：写入成功
 *         false：写入失败（无应答）
 * @note   通信流程：
 *         1. 发送起始信号
 *         2. 发送设备地址（写模式）
 *         3. 发送寄存器地址
 *         4. 发送数据
 *         5. 发送停止信号
 */
bool MPU6050_Write_Data(u8 Reg_Address, u8 IIC_Data);

/**
 * @brief  从MPU6050的指定寄存器读取数据
 * @param  Reg_Address：目标寄存器地址（如WHO_AM_I、ACCEL_XOUT_H等）
 * @retval 读取到的寄存器数据（0~255）
 * @note   通信流程：
 *         1. 发送起始信号
 *         2. 发送设备地址（写模式）
 *         3. 发送寄存器地址
 *         4. 发送重复起始信号
 *         5. 发送设备地址（读模式）
 *         6. 读取数据并发送非应答
 *         7. 发送停止信号
 */
u8 MPU6050_Read_Data(u8 Reg_Address);

/**
 * @brief  初始化MPU6050传感器
 * @note   配置流程：
 *         1. 初始化I2C总线
 *         2. 等待传感器上电稳定（200ms）
 *         3. 配置电源管理寄存器（解除休眠，选择时钟源）
 *         4. 配置采样率分频器和滤波器
 *         5. 配置陀螺仪和加速度计量程
 *         默认配置：
 *         - 采样率：100Hz
 *         - 陀螺仪量程：±2000°/s
 *         - 加速度计量程：±16g
 *         - 低通滤波器带宽：5Hz
 */
void MPU6050_Config(void);

/**
 * @brief  获取MPU6050的设备ID
 * @retval 设备ID（正常应为0x68）
 * @note   读取WHO_AM_I寄存器的值，用于验证传感器连接是否正常
 *         若返回值不为0x68，说明I2C通信异常或传感器故障
 */
u8 MPU6050_GetID(void);

/**
 * @brief  读取MPU6050的六轴数据（加速度计+陀螺仪）
 * @param  AccX：X轴加速度数据指针（16位有符号整数）
 * @param  AccY：Y轴加速度数据指针
 * @param  AccZ：Z轴加速度数据指针
 * @param  GyroX：X轴陀螺仪数据指针（16位有符号整数）
 * @param  GyroY：Y轴陀螺仪数据指针
 * @param  GyroZ：Z轴陀螺仪数据指针
 * @note   数据格式：
 *         - 每个轴数据由两个8位寄存器组成（高8位+低8位）
 *         - 需根据量程转换为物理单位：
 *           加速度：值 / 2048 → g（±16g量程时）
 *           陀螺仪：值 / 16.4 → °/s（±2000°/s量程时）
 */
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, 
                     int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ);

#endif /* __MPU6050_CONFIG_H */
